from openai import OpenAI
import json
from typing import Optional, Dict, Any


class SuTongAIClient:

    def __init__(self, api_key: str, base_url: str):
        self.client = OpenAI(
            api_key=api_key,
            base_url=base_url  # 关键：替换为速通AI的BaseURL
        )

        # 默认请求参数（可根据需求调整）
        self.default_model = "gpt-4o"  # 速通AI支持的模型（需参考其API文档确认）
        self.default_temperature = 0.7  # 随机性：0（严谨）~2（ creative）
        self.default_max_tokens = 1000  # 最大生成长度（含prompt）

    def get_ai_response(
            self,
            user_prompt: str = """- Goals: 将模糊的原始问题改写为具备唯一答案的修正问题，修正问题可测试豆包，deepseek等Agent的【网页搜索能力】。
- Constraints: 1.修正问题必须围绕拓竹科技公司3D打印领域展开；2.确保仅提出一个问题，不能仅仅改为判断题，仅输出改写问题；3.问题难度等级【低】。
- OutputFormat: 问题【】
输入问题""",
            model: Optional[str] = None,
            temperature: Optional[float] = None,
            max_tokens: Optional[int] = None,
            system_prompt: str = """- Role: 问题改写专家
- Profile: 你是一位在拓竹科技公司3D打印领域拥有深厚专业知识的专家，对行业内的各种设备、技术和应用场景有着全面而细致的了解。
- Goals: 将模糊的原始问题改写为具备唯一答案的修正问题，修正问题可测试豆包，deepseek等Agent的【网页搜索能力】。
- Constraints: 1.修正问题必须围绕拓竹科技公司3D打印领域展开；2.确保仅提出一个问题，不能仅仅改为判断题，仅输出改写问题；3.问题难度等级【低】。
- Skills: 你具备将模糊问题转化为具体、明确问题的能力，能够结合拓竹科技公司3D打印领域的最新技术和市场动态，确保问题的真实性。同时，你能够运用逻辑推理，确保问题的唯一性和可回答性。
- Workflow:
  1. 分析原始问题，明确其核心意图和潜在的模糊点。
  2. 结合3D打印领域的专业知识，确定问题的具体方向和关键要素。
  3. 通过逻辑推理，确保问题的唯一性和可回答性。
  4. 输出修正后的具体问题。- Goals: 将模糊的原始问题改写为具备唯一答案的修正问题，修正问题可测试豆包，deepseek等Agent的【网页搜索能力】。
- Constraints: 1.修正问题必须围绕拓竹科技公司3D打印领域展开；2.确保仅提出一个问题，不能仅仅改为判断题，仅输出改写问题；3.问题难度等级【低】。
- OutputFormat: 问题【】
输入问题:打印机死了"""
    ) -> Dict[str, Any]:
        try:
            # 构造对话消息（系统指令 + 用户提问）
            messages = [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ]

            # 发送API请求
            response = self.client.chat.completions.create(
                model=model or self.default_model,
                messages=messages,
                temperature=temperature or self.default_temperature,
                max_tokens=max_tokens or self.default_max_tokens
            )
            # 打印原始响应以便调试
            # print("原始响应:", response)

            # 检查响应类型并解析
            if isinstance(response, str):
                # 如果是字符串，尝试解析为JSON
                try:
                    response_data = json.loads(response)
                except json.JSONDecodeError:
                    # 如果解析失败，直接将字符串作为响应内容
                    return {
                        "response_text": response,
                        "model_used": model or self.default_model,
                        "token_usage": {"error": "无法解析token使用情况"},
                        "request_id": "未知"
                    }
            else:
                # 如果是对象，尝试转换为字典（使用Pydantic V2推荐的方法）
                try:
                    response_data = response.model_dump()  # 这里替换了dict()方法
                except AttributeError:
                    response_data = dict(response)

            # 根据解析后的数据构造结果
            if "choices" in response_data and len(response_data["choices"]) > 0:
                result = {
                    "response_text": response_data["choices"][0]["message"]["content"].strip(),
                    "model_used": response_data.get("model", model or self.default_model),
                    "token_usage": response_data.get("usage", {"error": "未返回token使用情况"}),
                    "request_id": response_data.get("id", "未知")
                }
            else:
                # 处理非标准格式的响应
                result = {
                    "response_text": str(response_data),
                    "model_used": model or self.default_model,
                    "token_usage": {"error": "未返回token使用情况"},
                    "request_id": "未知"
                }

            return result

        except Exception as e:
            # 捕获请求异常（如API Key无效、网络错误、参数错误等）
            error_msg = f"速通AI调用失败：{str(e)}"
            print(error_msg)
            raise Exception(error_msg)  # 抛出异常便于上层处理


# ------------------- 示例：调用速通AI -------------------
if __name__ == "__main__":
    # 1. 配置速通AI的关键信息
    SUTONG_API_KEY = "sk-JmUHFrwmr4hd1dzPpPlZIXrljhsnyuQbd7oJ2l3ktkwTvLEG"
    SUTONG_BASE_URL = "https://api.34ku.com/v1"

    # 2. 初始化客户端
    ai_client = SuTongAIClient(
        api_key=SUTONG_API_KEY,
        base_url=SUTONG_BASE_URL
    )

    # 3. 定义用户需求（可替换为任意提问）
    user_input = "张继群是谁"

    # 4. 调用AI并获取结果
    try:
        print("正在请求速通AI...")
        ai_result = ai_client.get_ai_response(
            user_prompt=user_input,
            temperature=0.6,  # 降低随机性，让回答更严谨
            max_tokens=800  # 限制生成长度
        )

        # 5. 打印结果
        print("\n=== 速通AI响应 ===")
        print(f"回答：{ai_result['response_text']}")

    except Exception as e:
        print(f"程序执行失败：{e}")
